package com.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

// 售票代理处理器（火车票代售点会调用这个类的invoker方法来处理业务）
public class TicketAgentHandler implements InvocationHandler {

    // 真实干活的对象（相当于火车站）
    private TicketService realWorker;

    public TicketAgentHandler(TicketService realWorker) {
        this.realWorker = realWorker;
    }

    /**
     * @param proxy 代理类对象的实例（相当于某个具体的火车票代售点）
     * @param method 被代理对象（也就是真实干活的对象，相当于火车站）的method
     * @param args 代理类对象传进来的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 通过动态代理，可以在干活之前或者之后干点想干的
        beforeInvoke(proxy, method, args);

        Object result = method.invoke(realWorker, args);

        afterInvoke(proxy, method, args, result);

        return result;
    }

    private void beforeInvoke(Object proxy, Method method, Object[] args){
        System.out.println("这里是TicketAgentHandler，" + method.getName() + "()方法即将被调用" );
    }

    private void afterInvoke(Object proxy, Method method, Object[] args, Object result){
        System.out.println("这里是TicketAgentHandler，" + method.getName() + "()方法已经被调用，返回值：" + result);
    }
}
